home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / Hellcats FlightRecorder / FlightRecQT.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-17  |  3.5 KB  |  167 lines  |  [TEXT/KAHL]

  1. #include "FlightRecorder.h"
  2.  
  3. void CreateMyVideoTrack (Movie theMovie);
  4. OSErr PrepareVideoTrack (storage *s, CWindowPtr pressMe);
  5. OSErr  PrepareForSampling (storage *s, CWindowPtr pressMe);
  6. OSErr MakeAMovieFile (storage *s, CWindowPtr pressMe);
  7.  
  8. Boolean StartQuickTimeRecording (storage *s, CWindowPtr pressMe) 
  9. {
  10.     short        error;
  11.     long        result;
  12.  
  13.     error = EnterMovies();
  14.     if(error) {
  15.         DebugStr("\p EnterMovies");
  16.     }
  17.     
  18.     error = MakeAMovieFile(s, pressMe);
  19.     if(error) {
  20.         DebugStr("\p MakeAMovieFile");
  21.     }
  22.     
  23.     error = PrepareForSampling(s, pressMe);
  24.     if(error) {
  25.         DebugStr("\p PrepareForSampling");
  26.     }
  27.     
  28.     return error;
  29.  
  30. }
  31.  
  32. OSErr MakeAMovieFile (storage *s, CWindowPtr pressMe)
  33. {
  34.     FSSpec             mySpec;
  35.     short             resRefNum = 0;
  36.     short             resId = 0;
  37.     OSErr             err = noErr;
  38.     
  39.     FSMakeFSSpec(0, 0,"\pInstant Reply", &mySpec);
  40.  
  41.     err = CreateMovieFile (        &mySpec, 
  42.                                 'TVOD',
  43.                                 -1,    // smSystemScript 
  44.                                 createMovieFileDeleteCurFile,
  45.                                 &resRefNum, 
  46.                                 &s->movie );
  47.                                 
  48.     if(err) DebugStr("\pCreateMovieFile");
  49.  
  50.     PrepareVideoTrack (s, pressMe);
  51.     
  52.     err = AddMovieResource (s->movie, resRefNum, &resId,
  53.                                          "\pInstant Reply");
  54.  
  55.     if(err) DebugStr("\p AddMovieResource");
  56.     
  57.     if (resRefNum) CloseMovieFile (resRefNum);
  58.  
  59.     return err;
  60. }
  61.  
  62. OSErr PrepareVideoTrack (storage *s, CWindowPtr pressMe)
  63. {
  64.     OSErr                 err = noErr;
  65.  
  66.     s->track = NewMovieTrack (s->movie, 
  67.                                     FixRatio(pressMe->portRect.right,1),
  68.                                     FixRatio(pressMe->portRect.bottom,1), 
  69.                                     kNoVolume);
  70.     
  71.                                     
  72.     if(err = GetMoviesError()) DebugStr("\p NewMovieTrack");
  73.  
  74.     s->media = NewTrackMedia (s->track, VideoMediaType,
  75.                                     600,     // Video Time Scale
  76.                                     nil, 0);
  77.                                     
  78.     if(err = GetMoviesError()) DebugStr("\p NewTrackMedia");
  79.     
  80.     err = BeginMediaEdits (s->media);
  81.     if(err = GetMoviesError()) DebugStr("\p BeginMediaEdits");
  82.  
  83.     err = PrepareForSampling (s, pressMe);
  84.  
  85. }
  86.  
  87. // FlightRecorder.h
  88.  
  89. OSErr  PrepareForSampling (storage *s, CWindowPtr pressMe)
  90. {
  91.     OSErr        err = noErr;
  92.     long        maxSize;
  93.  
  94.     err = GetMaxCompressionSize (pressMe->portPixMap,
  95.                                 &pressMe->portRect, 
  96.                                 0, // let ICM choose depth
  97.                                 codecNormalQuality, 
  98.                                 'rle ', 
  99.                                 (CompressorComponent) anyCodec,
  100.                                 &maxSize    );
  101.     if(err) {
  102.         DebugStr("\p GetMaxCompressionSize sucks");
  103.     }
  104.     
  105.     s->imageDesc =     (ImageDescriptionHandle)NewHandle(4);
  106.     s->compressBuff = NewHandle(maxSize);
  107.     MoveHHi( (Handle)s->compressBuff );
  108.     HLock( (Handle)s->compressBuff );
  109.  
  110.     return err;
  111. }
  112.  
  113.  
  114. void CompressFrame(storage *s,CWindowPtr pressMe)
  115. {
  116.     char    *compressedDataPtr;
  117.     OSErr    err;
  118.     
  119.     compressedDataPtr = StripAddress( s->compressBuff );
  120.     err = CompressImage (    pressMe->portPixMap, 
  121.                                 &pressMe->portRect, 
  122.                                 codecHighQuality,
  123.                                 'rle ',
  124.                                 s->imageDesc, 
  125.                                 compressedDataPtr );
  126.     if(err) {
  127.         DebugStr("\p CompressImage");
  128.     }
  129.  
  130.     err = AddMediaSample(s->media,             
  131.                         s->compressBuff,
  132.                         0,            // no offset in data
  133.                         (**s->imageDesc).dataSize,  
  134.                         5,            // frame duration = 1/10 sec
  135.                         (SampleDescriptionHandle)s->imageDesc, 
  136.                         1,            // one sample
  137.                         0,            // self-contained samples
  138.                         nil);
  139.  
  140.     if(err) {
  141.         DebugStr("\p AddMediaSample");
  142.     }
  143.  
  144. }
  145.     
  146.  
  147. void EndRecording(storage *s)
  148. {    
  149.     OSErr    err;
  150.     
  151.     err = EndMediaEdits (s->media);
  152.     if(err) {
  153.         DebugStr("\p EndMediaEdits");
  154.     }
  155.     
  156.     err = InsertMediaIntoTrack (s->track, 
  157.                                 0,    // track start time
  158.                                 0,    // media start time
  159.                                 GetMediaDuration (s->media),
  160.                                 kFix1);
  161.     if(err) {
  162.         DebugStr("\p InsertMediaIntoTrack");
  163.     }
  164.     DisposeHandle ((Handle)s->imageDesc);
  165.     DisposeHandle (s->compressBuff);
  166. }
  167.